package com.jxtc.enterprise.tenant.service;


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.jxtc.enterprise.common.constants.MealTypeEnum;
import com.jxtc.enterprise.common.entity.Company;
import com.jxtc.enterprise.common.entity.FoodMenu;
import com.jxtc.enterprise.common.entity.MenuStoreConfig;
import com.jxtc.enterprise.common.mapper.CompanyMapper;
import com.jxtc.enterprise.common.mapper.FoodMenuMapper;
import com.jxtc.enterprise.common.mapper.MenuStoreConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.MessageFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class TenantCompanyMenuService {


    @Autowired
    private CompanyMapper companyMapper;

    @Autowired
    private FoodMenuMapper foodMenuMapper;

    @Autowired
    private MenuStoreConfigMapper menuStoreConfigMapper;

    /**
     * 当为公司某一餐挑选多个店铺后，为每个店铺在 meal_store_config 表添加一条新记录，此方法根据 公司id，用餐时段，挑选的店铺，创建 MealStoreConfig VO对象
     * @param companyId
     * @param mealType
     * @param siteStoreList
     * @return
     */
    public List<MenuStoreConfig> buildMenuStoreConfigVoForNewAddStore(String companyId, String mealType, List<FoodMenu> siteStoreList) {

        List<MenuStoreConfig> menuStoreConfigs = new ArrayList<>();

        // 用户小程序上，该店铺，用户可以点餐的开始时间, hh:mm:ss
        String startTime;

        // 用户小程序上，该店铺，用户可以点餐的截止时间, hh:mm:ss
        String endTime;

         // 用户小程序上，该店铺，用户取消订单的截止时间, hh:mm:ss
        String canCancelTime;

        // 用户小程序上，该店铺，预计送达时间，绝大多少店铺都是统一的送达时间，部分场景下，各个店铺可自定义送达时间, hh:mms:ss
        String deliveryTime;

        // 打印方式，批量打印 或者 一单一打印, 1 批量打印，2 一单一打印
        String printType;

        // 批量打印时，定时批量打印的时间, hh:mms:ss
        String printTime;

        // 先尝试从公司信息表中，获取该公司对6个用供餐时段的默认配置，并找出
        Company companyDetails = companyMapper.selectById(companyId);
        String mealsConfigStr = companyDetails.getMealsConfig();
        JSONArray mealConfigs = JSONArray.parseArray(mealsConfigStr);
        JSONObject mealTimeConfigVo = null;
        for(int k = 0 ; k < mealConfigs.size(); k ++) {
            JSONObject mealConfigVo = mealConfigs.getJSONObject(k);
            String mealTypeNameEn = mealConfigVo.getString("mealType");
            Boolean enabled = mealConfigVo.getBoolean("enabled");
            // 当为某个用餐时段挑选店铺时，该用餐时段在公司配置信息中有默认配置值，且该公司勾选了该用餐时段，才使用公司配置信息中的用餐时段数据，否则使用枚举类中定义的默认值
            if (mealTypeNameEn.equals(mealType) && enabled) {
                mealTimeConfigVo = mealConfigVo;
                break;
            }
        }


        if (mealTimeConfigVo != null) {
            // 优选使用 根据页面选择的用餐时段，以及该公司配置信息中，该用餐时段默认配置值
            startTime = mealTimeConfigVo.getString("startTime");
            endTime = mealTimeConfigVo.getString("endTime");
            // 当前页面上没有 取消订单截止时间，因此使用 00:00:00 避免null导致的异常
            canCancelTime = mealTimeConfigVo.getString("00:00:00");
            deliveryTime = mealTimeConfigVo.getString("deliveryTime");
            printType = MealTypeEnum.convertPrintTypeIntToString(mealTimeConfigVo.getInteger("printType"));
            printTime = mealTimeConfigVo.getString("printTime");
        } else {
            // 当页面选择的用餐时段在公司配置信息中没有默认配置值，再使用 枚举类中定义的 值
            MealTypeEnum mealTypeEnum = MealTypeEnum.getMealTypeEnumByNameEn(mealType);
            startTime = mealTypeEnum.getStartTime();
            endTime = mealTypeEnum.getEndTime();
            canCancelTime = mealTypeEnum.getCanCancelTime();
            deliveryTime = mealTypeEnum.getDeliveryTime();
            printType = MealTypeEnum.convertPrintTypeIntToString(mealTypeEnum.getPrintType());
            printTime = mealTypeEnum.getPrintTime();
        }
        // 列表中的每一项 为菜单上店铺对应的数据项
        for (FoodMenu storeItemOfMenu : siteStoreList) {
            MenuStoreConfig menuStoreConfig = new MenuStoreConfig();
            menuStoreConfig.setCompanyId(storeItemOfMenu.getCompanyId()); // 店铺的配置项是针对那个公司的配置
            menuStoreConfig.setMenuId(storeItemOfMenu.getMenuId());
            menuStoreConfig.setMenuItemId(storeItemOfMenu.getId());
            menuStoreConfig.setStoreId(storeItemOfMenu.getStoreId());
            menuStoreConfig.setMealType(mealType);
            // 某个店铺针对某个公司配置的 供餐开始，结束时间，预计送达时间，打印方式，批量打印时间
            menuStoreConfig.setStartTime(startTime);
            menuStoreConfig.setEndTime(endTime);
            menuStoreConfig.setPrintType(printType);
            menuStoreConfig.setPrintTime(printTime);
            menuStoreConfig.setDeliveryTime(deliveryTime);

            menuStoreConfig.setDelFlag(false);
            menuStoreConfigs.add(menuStoreConfig);
        }

        return menuStoreConfigs;
    }


    /**
     * 删除菜单，并删除菜单上的店铺在 menu_store_config 表的配置
     * 此逻辑涉及两个sql语句，而且这两个sql需要在同一个事务中完成，因此为此方法添加 事务注解
     * @param companyId 要删除的菜单所属的公司的id
     * @param menuId 菜单id
     * @param requestId 请求id
     * @return 返回 food_menu 表中，被标记为删除的 菜单记录的行数，正常情况下返回值 大于等于1，
     *          1 表示删除还没有配置店铺，菜品的菜单，即仅删除了marker为1 的记录；大于1表示删除配置了店铺，菜品的菜单
     *          0 表示没有匹配条件的菜单项
     */
    @Transactional
    public int deleteMenuAndRelatedMenuConfigs(String companyId, String menuId, String requestId) {

        // menuId具有全局唯一性，不需要再传递租户id; 删除 food_menu 表中 marker为1(菜单),2(菜单上的店铺),3(为菜单挑选的菜品) 的所有记录
        int deletedMenuCount = foodMenuMapper.update(new LambdaUpdateWrapper<FoodMenu>()
                .eq(FoodMenu::getMenuId, menuId)
                .set(FoodMenu::getUpdateTime, LocalDateTime.now())
                .set(FoodMenu::getDelFlag, true));
        String msg = MessageFormat.format("删除 {0} 的菜单 {1} 成功, 更新记录数 {2}", companyId, menuId, deletedMenuCount);
        log.info("requestId {}, tenant view, /deleteMenu response: {}", requestId, msg);

        int deletedMenuStoreConfigCount = menuStoreConfigMapper.update(new LambdaUpdateWrapper<MenuStoreConfig>()
                .eq(MenuStoreConfig::getMenuId, menuId)
                .set(MenuStoreConfig::getUpdateTime, LocalDateTime.now())
                .set(MenuStoreConfig::getDelFlag, true));
        log.info("requestId {}, tenant view, 从menu_store_config表删除公司：{} 的菜单：{} 中 {} 店铺配置 成功 ", requestId, companyId, menuId, deletedMenuStoreConfigCount);

        return deletedMenuCount;
    }

}
